// sm4.js —— 纯 JS 轻量加密，只保留 encrypt 和 decrypt
const key = '0123456789abcdef'; // 简单 key，用于 XOR

// 将字符串转成 Uint8Array
function str2bytes(str) {
  const encoder = new TextEncoder(); // 小程序和浏览器都支持
  return encoder.encode(str);
}

// 将 Uint8Array 转回字符串
function bytes2str(bytes) {
  const decoder = new TextDecoder();
  return decoder.decode(bytes);
}

// Base64 编码/解码（浏览器/小程序兼容）
function b64Encode(bytes) {
  let binary = '';
  const len = bytes.length;
  for (let i = 0; i < len; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  if (typeof btoa !== 'undefined') {
    return btoa(binary);
  } else {
    // 小程序环境
    return wx.arrayBufferToBase64(bytes.buffer);
  }
}

function b64Decode(str) {
  let binary;
  if (typeof atob !== 'undefined') {
    binary = atob(str);
    const bytes = new Uint8Array(binary.length);
    for (let i = 0; i < binary.length; i++) {
      bytes[i] = binary.charCodeAt(i);
    }
    return bytes;
  } else {
    // 小程序环境
    const buffer = wx.base64ToArrayBuffer(str);
    return new Uint8Array(buffer);
  }
}

// XOR 加密/解密（对称）
function xorCipher(bytes, key) {
  const keyBytes = str2bytes(key);
  const result = new Uint8Array(bytes.length);
  for (let i = 0; i < bytes.length; i++) {
    result[i] = bytes[i] ^ keyBytes[i % keyBytes.length];
  }
  return result;
}

// 封装 encrypt 函数
export function encrypt(data) {
  if (!data || typeof data !== 'string') {
    throw new Error('输入数据无效');
  }
  const dataBytes = str2bytes(data);
  const xored = xorCipher(dataBytes, key);
  return b64Encode(xored);
}

// 封装 decrypt 函数
export function decrypt(encryptedData) {
  if (!encryptedData || typeof encryptedData !== 'string') {
    throw new Error('加密数据无效');
  }
  const bytes = b64Decode(encryptedData);
  const decodedBytes = xorCipher(bytes, key);
  return bytes2str(decodedBytes);
}